import json
import os
from model_api import qwen_api_no_search, zhipu_api_no_search
from tqdm import tqdm

path_dir = os.path.dirname(os.path.abspath(__file__))

system_prompt = """你是一个金融知识专家，擅长通过深度分析和权威来源检索，为专业术语提供精准、无歧义的解释。
你的任务是根据我给你的相关文档，给出专业术语的定义。
我给你的文档已经是经过校验的文档，因此你应当从文档中寻找简洁明了的专业术语定义，并直接摘抄；你不能进行自由发挥。

你仅需要输出一句话，描述这个专业术语的核心定义；如果你发现我给你的相关文档中不包含这个专业术语的定义，请你输出“ERROR”替代。
我下面给你两个示例：

# 示例1

专业术语：
量化宽松

文档信息：
<document>
量化宽松（Quantitative Easing，缩写QE），主要是指中央银行通过购买国债等中长期债券，增加基础货币供给，向市场注入大量流动性资金的干预方式，以鼓励金融机构开支和借贷，也被简化地形容为间接增印钞票。 [10]
量化宽松政策的根本目的是打破“流动性陷阱”，在名义利率接近零的情况下影响公众的通货膨胀预期，从而使实际利率为负，刺激银行放贷，达到增加消费和投资的目的。 [11]无论从广义还是狭义上看，量化宽松是非常规的货币政策， [12]其与前瞻性指引、扭曲操作、未来货币政策承诺一并被美国经济学家佛雷德里克·S·米什金（FredericS．Mishkin）视为四类非常规货币政策工具。 [13]量化宽松政策会使央行的资产负债表扩张，导致基础货币的供应量扩大，可能会是短期内刺激经济的强大力量，也可能在未来导致通货膨胀等问题。 [14]
</document>

你的输出：
指中央银行通过购买国债等中长期债券，增加基础货币供给，向市场注入大量流动性资金的干预方式，以鼓励金融机构开支和借贷，也被简化地形容为间接增印钞票。

# 示例2:
术语名称：
建仓

文档信息：
<document>
量化宽松（Quantitative Easing，缩写QE），主要是指中央银行通过购买国债等中长期债券，增加基础货币供给，向市场注入大量流动性资金的干预方式，以鼓励金融机构开支和借贷，也被简化地形容为间接增印钞票。
</document>

你的输出：
ERROR
"""

user_prompt = """
请你结合我给你的文档，解释我输入的专业术语：
专业术语：
{prop}

文档信息：
<document>
{document}
</document>
"""


def get_property_definition(model, prop, document):
    convs = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt.format(prop=prop, document=document)}
    ]
    if 'qwen' in model.lower():
        llm_ans = qwen_api_no_search.qwen_call(model=model, convs=convs)
    elif 'glm' in model.lower():
        llm_ans = zhipu_api_no_search.zhipu_call(model=model, convs=convs)
    else:
        raise ValueError
    llm_ans['prop'] = prop
    return llm_ans


def get_ref_web(documents_list, prop_idx):
    for document_name in documents_list:
        if document_name.startswith(f"prop_{prop_idx}_url"):
            return document_name
    return None


if __name__ == '__main__':
    phase1_model = "qwen3-max"
    model = "qwen3-max"
    with open(os.path.join(path_dir, "data", "properties.json"), 'r', encoding='utf-8') as fp:
        properties = json.load(fp)

    documents_list = os.listdir(os.path.join(path_dir, "phase1.5_output"))

    output_fp = open(os.path.join(path_dir, "phase1.8_output", f"{model}_prop_desc.jsonl"), "w", encoding='utf-8')

    with open(os.path.join(path_dir, "phase1_output", f"{phase1_model}_prop_desc.jsonl"), 'r', encoding='utf-8') as fp:
        qwen3_max_prop_desc_lines = fp.readlines()

    for prop_idx, (prop, prop_desc_line) in tqdm(enumerate(zip(properties, qwen3_max_prop_desc_lines))):
        document_name = get_ref_web(documents_list, prop_idx)
        prop_desc = json.loads(prop_desc_line)
        prop_desc.pop("search")
        prop_desc.pop("thinking")
        prop_desc.pop("usage")

        if document_name is None:
            prop_desc['define_with_ref'] = ''
            prop_desc['ref'] = {'url': '', 'content': ''}
        else:
            with open(os.path.join(path_dir, "phase1.5_output", document_name), "r", encoding='utf-8') as fp:
                ref_doc = json.load(fp)
            document = ref_doc['answer']
            llm_ans = get_property_definition(model, prop, document)
            prop_desc['define_with_ref'] = llm_ans['answer']
            prop_desc['ref'] = {'url': ref_doc['url'], 'content': ref_doc['answer']}

        output_fp.write(json.dumps(prop_desc, ensure_ascii=False) + "\n")
    output_fp.close()
